# 常见高阶函数
from functools import reduce

numbers = [1, 2, 3, 4, 5]
# map(): 映射函数,对可迭代对象中的每个元素应用函数并返回一个新的迭代器
squares = map(lambda x: x ** 2, numbers)
print(list(squares))    # [1, 4, 9, 16, 25]

print("=" * 50)
# filter(): 过滤函数,对可迭代对象中的每个元素应用函数，返回一个新的迭代器，只包含满足条件的元素。
evens = filter(lambda x: x % 2 == 0, numbers)
print(list(evens))  # [2, 4]

print("=" * 50)
# reduce(): 函数接收一个函数和一个序列，将函数应用到序列的每个元素上进行累积，并返回一个值。
# 乘积
mul_of_numbers = reduce(lambda x, y: x * y, numbers)
print(mul_of_numbers)
# 和累加
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers)

print("=" * 50)
# 纯函数与副作用
# 纯函数：函数的输入参数和输出结果都只依赖于其输入参数，并且不依赖于外部状态。
def add(x, y):
    return x + y
print(add(1, 2))

# 副作用：函数的输出结果依赖于函数外部的状态，例如修改了全局变量、修改了函数参数的引用对象等等。
count = 0
def increment():
    global count
    # 修改了全局变量，导致函数的输出结果依赖于全局变量
    count += 1

increment()
print(count)

print("=" * 50)
# 组合函数
def compose(f,g):
    return lambda x: f(g(x))

add_2 = lambda x: x + 2
mul_3 = lambda x: x * 3
composed_func = compose(add_2, mul_3)
print(composed_func(5)) # 17